import java.io.*;
import java.util.*;

//TIP 要<b>运行</b>代码，请按 <shortcut actionId="Run"/> 或
// 点击装订区域中的 <icon src="AllIcons.Actions.Execute"/> 图标。
public class StudentManager {

    static Scanner sc = new Scanner(System.in);
    static Map<Long,Student>Students = new HashMap<>();
    public static void display(){
        System.out.println("=========== 学生管理系统 V1.0 ==========");
        // V
        System.out.println("1、添加学生信息");
        System.out.println("2、删除学生信息");
        System.out.println("3、修改学生信息");
        System.out.println("4、按学号查询学生信息");
        // V
        System.out.println("5、查询所有学生信息");
        System.out.println("6、保存学生数据");
        System.out.println("7、退出系统");
        System.out.println("========================================");
    }

    public static void main(String[] args) {
        loadStudent(); //读取学生数据
        while (true){     //循环展示
            display();
            String s = sc.nextLine(); //获取数据
            switch (s){
                case "1" :
                    addStudent(); //添加学生信息
                    break;
                case "2" :
                    deleteStudent(); //删除学生信息
                    break;
                case "3" :
                    addStudent(); //修改学生信息
                    break;
                case "4" :
                    getStudentById(); //按学号查询学生信息
                    break;
                case "5" :
                    getAllStudent(); //查询所有学生信息
                    break;
                case "6" :
                    getAllStudent(); //保存学生数据
                    break;
                case "7" :
                    saveAllStudents(); // 保存数据
                    System.out.println("退出系统");
                    return;
                default:
                    System.out.println("请输入正确的选项！");
            }
        }
        

    }

    private static void addStudent(){  //添加学生信息
        System.out.print("请输入学生信息（格式：学号，姓名，年龄，年级，例如：100，张三，18，大一）：");
        String s = sc.nextLine();  //获取数据
        if (s == null || s.trim().isEmpty()){
            System.out.println("输入不能为空！");
            addStudent();  //重新添加
            return;    //跳出方法
        }
        String[] parts = s.split("，"); //分割数据
        if (parts.length != 4){
            System.out.println("输入格式不正确！");
            addStudent();
            return;
        }
        try {
            long id = Long.parseLong(parts[0].trim()); //转换为 long
            String name = parts[1].trim(); //转换为 String
            int age = Integer.parseInt(parts[2].trim()); //转换为 int
            String gradeName = parts[3].trim(); //转换为 String

            Student student = new Student(id,name, age, gradeName); // 创建对象，注意参数顺序与构造方法匹配
            Students.put(id, student);
            System.out.println("添加成功！ 学号：" + id + " 姓名：" + name + "的信息已保存");
        }catch (NumberFormatException e){ //数字转换异常
            System.out.println("输入数据不正确！请重新输入！");
            addStudent(); //重新添加
        }


    }
     private static void deleteStudent(){  //删除学生信息
         System.out.println("请输入要删除学生的学号：");
         String id = sc.nextLine();
         long l=0;
         while (true){
             if (id == null || id.trim().isEmpty()){
                 System.out.println("输入不能为空！");
                 return;
             }
             try {
                 l =Long.parseLong(id);
                 break;
             }catch (Exception e){
                 System.out.println("输入学生id");
                 id = sc.nextLine();

             }
         }
         Students.remove(l);
         System.out.println("删除成功！");
     }

    private static void getStudentById(){ //按学号查询学生信息
         System.out.println("请输入要查询学生的学号：");
         String id = sc.nextLine();
         if (id == null || id.trim().isEmpty()){
             System.out.println("输入不能为空！");
             return;
         }
         long l = Long.parseLong(id);
         Student student = Students.get(l);
         if (student == null){
             System.out.println("没有找到该学生！");
             return;
         }
        System.out.println( student);
    }
    private static void getAllStudent(){ //查询所有学生信息
        Collection<Student> values = Students.values();
        for (Student student : values){
            System.out.println(student);
        }
    }
    private static void saveAllStudents() {  //保存学生数据
        List<Student> list = Students.values() //获取所有学生数据
                .stream()
                .toList();
        try(ObjectOutputStream os =new ObjectOutputStream(new FileOutputStream("students-1.ser"))){
            os.writeObject(list);
            System.out.println("保存成功！");
        } catch (Exception e) {
            System.out.println("保存失败！"+e);
        }
    }

    private static void loadStudent() {
        try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("students.ser"));){
            //1、读取所有数据
            List<Student> o = (List<Student>) ois.readObject();
            for (Student student : o) {
                //2、放到容器中
                Students.put(student.getId(),student);
            }
        }catch (Exception e){
            System.out.println("加载失败！"+e);
        }//读取学生数据
    }
}